<?php

class LoginController extends AppController {

    var $name = 'Login';
    var $uses = array('Usuario');
    var $helpers = array('Html');

    /**
     * @desc Monta a tela principal
     */
    function index(){
        $usuario = $this->Session->read('GESTAO');
        if ($usuario){
            $this->redirect(array('controller'=>'home','action'=>'index'));
        }
    }
    
    /**
     * @desc Funcao que realiza a autenticacao do usuario no sistema
     */
    function logar(){
        $login = $this->anti_injection($_POST['usuario']);
        $senha = $this->anti_injection($_POST['senha']);

        $usuario = $this->Usuario->find('first', array(
            'conditions'=>array(
                'usuario' => $login,
                'senha' => md5($senha)
            ),
            'contain'=>array(
                'PerfilAcesso'=>array('Menu','order'=>'PerfilAcesso.menu_id asc')
            )
        ));

        // Verifica se localizou o usuario
        if ( !empty($usuario) ) {
            $this->autenticacaoUsuario($usuario);
            
            $this->redirect(array('controller' => 'home', 'action' => 'index'));
        }

        $this->Session->setFlash(__('Acesso Negado: O Usuário não foi autenticado no sistema.', true), 'default', array('tipo' => 'E'), 'mensagem');
        $this->redirect(array('action' => 'index'));
    }
    
    /**
     * @desc Funcao que evitar sqlinjection
     * @param string $sql
     * @return string 
     */
    private function anti_injection($sql){

        $sql = preg_replace(sql_regcase("/(from|select|insert|delete|where|drop table|show tables|#|\*|--|\\\\)/"), "", $sql);
        $sql = trim($sql);  //limpa espaços vazio
        $sql = strip_tags($sql); //tira tags html e php
        $sql = addslashes($sql); //Adiciona barras invertidas a uma string

        return $sql;
    }
    
    /**
     * @desc Autenticacao auxiliar, grava na sessao o usuario logado
     * @param array $usuario 
     */
    private function autenticacaoUsuario($usuario){

        $usuario = $this->montarPermissaoAcesso($usuario);
        $this->Session->write('GESTAO', $usuario);
        
        // Atualiza o último acesso do usuário
        $agora = getdate();
        $agora = $agora['year'].'-'.$agora['mon'].'-'.$agora['mday'].' '.$agora['hours'].':'.$agora['minutes'].':'.$agora['seconds'];

        $this->Usuario->Save(array(
            'id' => $usuario['Usuario']['id'],
            'ultimo_acesso' => $agora
        ));

    }
    
    /**
     * @desc Desconecta o usuario do sistema
     */
    function logout(){
        $this->Session->destroy();
        $this->Session->setFlash(__('Desconectado com sucesso.', true), 'default', array('tipo' => 'S'), 'mensagem');
        $this->redirect(array('action' => 'index'));
    }
    
    /**
     * @desc Monta a pagina de sem permissao
     */
    function sem_permissao(){
        $this->layout = 'sem_permissao';
    }
    
    /**
     * @desc Monta a permissao de acesso do usuario logado
     * @param array $usuario 
     * @return array $usuario
     */
    function montarPermissaoAcesso($usuario){
        $perfis = $usuario['PerfilAcesso'];
        $indice = 0;
        foreach( $perfis as $perfil ):

            $index = '';
            if ( $perfil['Menu']['action'] != 'index' ){
                $index = '/'.$perfil['Menu']['action'];
            }
            
            $security[$indice] = $perfil['menu'] == 1?'/'.$perfil['Menu']['controller'].($index==''?'/index':$index):''; $perfil['menu'] == 1?$indice++:'';
            $security[$indice] = $perfil['visualizar'] == 1?'/'.$perfil['Menu']['controller'].($index==''?'/view':$index):''; $perfil['visualizar'] == 1?$indice++:'';
            $security[$indice] = $perfil['inserir'] == 1?'/'.$perfil['Menu']['controller'].($index==''?'/add':$index):''; $perfil['inserir'] == 1?$indice++:'';
            $security[$indice] = $perfil['alterar'] == 1?'/'.$perfil['Menu']['controller'].($index==''?'/edit':$index):''; $perfil['alterar'] == 1?$indice++:'';
            $security[$indice] = $perfil['excluir'] == 1?'/'.$perfil['Menu']['controller'].($index==''?'/delete':$index):''; $perfil['excluir'] == 1?$indice++:'';
            
          endforeach;
        $usuario['security'] = $security;
        return $usuario;
    }

}